package handler;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

/**
 * 需求：一个Java中的Date数据类型，存到数据库的时候存成一个1970年至今的毫秒数，
 * 从数据库取出来时转换成Java的Date类型，
 * 即java的Date与数据库的varchar毫秒值之间的相互转换。
 */
public class DateTypeHandler extends BaseTypeHandler<Date> {
    /**
     * 将Java类型转换成数据库需要的类型
     *
     * @param preparedStatement 执行SQL语句的对象
     * @param i 要转换的字段所在的位置
     * @param date
     * @param jdbcType
     * @throws SQLException
     */
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
        //获取时间毫秒值
        long timeMillsValue = date.getTime();
        //转换为数据库需要的类型，第一个参数是被转换字段所在的位置
        preparedStatement.setLong(i,timeMillsValue);
    }

    /**
     * 将数据库中类型转换成Java类型
     *
     * @param resultSet 查询出的结果集
     * @param s 要转换的字段的名称
     * @return
     * @throws SQLException
     */
    @Override
    public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
        //获取结果集中需要的数据(bigint)转换成Date类型并返回
        long timeMillsValue = resultSet.getLong(s);
        Date date = new Date(timeMillsValue);
        return date;
    }

    /**
     * 将数据库中类型转换成Java类型
     *
     * @param resultSet
     * @param i 要转换的字段的下标
     * @return
     * @throws SQLException
     */
    @Override
    public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
        //获取结果集中需要的数据(bigint)转换成Date类型并返回
        long timeMillsValue = resultSet.getLong(i);
        Date date = new Date(timeMillsValue);
        return date;
    }

    /**
     * 将数据库中类型转换成Java类型
     *
     * @param callableStatement
     * @param i
     * @return
     * @throws SQLException
     */
    @Override
    public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        long timeMillsValue = callableStatement.getLong(i);
        Date date = new Date(timeMillsValue);
        return date;
    }
}
